# 在列表中删除数据元素时,如果删除的是中间的元素,后续的索引会发生改变

# 1. remove
# remove是根据数据的值删除该元素的方法
list1 = [1, 2, 3, 3, 2, 1, 4, 5, 6]
# 列表使用remove删除数据时,不会产生新的列表,而是在原有列表上修改数据
# print(list1.remove(5)) # None
# 需求: 删除列表中的5
list1.remove(5)
print(list1)  # [1, 2, 3, 3, 2, 1, 4, 6]

print('------------------------')
# 需求:删除列表中的2
list1.remove(2)
# remove 只能删除从左至右第一个出现的该元素. 无法全部删除
print(list1)  # [1, 3, 3, 2, 1, 4, 6]

# 需求: 删除列表中的9
# 使用remove删除列表元素时,列表中元素必须存在,否则报错
# ValueError: list.remove(x): x not in list
# list1.remove(9)
# print(list1)


print('------------------------')
# 2. pop
# pop 是根据数据的索引,删除指定位置元素的方法
list2 = [1, 2, 4, 3, 2]

# 需求: 删除索引值为3的数据
pop_value = list2.pop(3)
print(list2)  # [1, 2, 4, 2]
# pop删除数据后,会将被删除的数据返回,可以使用变量接收
print(pop_value)  # 3

# 需求: 删除索引值为9的数据
# 注意: 删除数据时,不要删除不存在的索引位置的数据,会报错.
# IndexError: pop index out of range
# list2.pop(9)
# print(list2)

print('------------------------')
# 3. clear
# 清空列表, 此时列表数据为空
list3 = [1, 2, 3]
list4 = list3

print(list3)
print(list4)

print('---------------------')

# list3.clear() # 不等价于 list3 = []
#
# print(list3) # []
# print(list4) # []

print('-----------------------')
list3 = []

print(list3)  # []
print(list4)  # [1, 2, 3]

# 列表相当于储蓄罐, clear相当于将钱全部倒出,此时储蓄罐可以继续使用, list3 = [] 相当于将储蓄罐敲碎,又买了一个新的空储蓄罐

print('------------------------')
# 4. del
# del 不是 列表的专有操作方式, 所有的容器只要内部数据可以被删除,都可以使用del,但是前提是你必须找到该元素
list5 = [1, 2, 3, 4, 5]
# 需求: 使用del删除下标为4的数据
del list5[4]
print(list5)  # [1, 2, 3, 4]

# 注意: 如果要删除这个元素,必须要先可以获取到这个元素
# del list5[12]
# 如果我们要删除数据的索引不存在则会报错.
# IndexError: list assignment index out of range
# print(list5)

# 这个删除方法比较暴力,所以我们尽量使用pop
# del list5
# NameError: name 'list5' is not defined
# print(list5)


print('------------------------')
# 练习: 将list_num中所有的3删除
list_num = [1, 2, 3, 3, 2, 1]

for i in list_num:
    if i == 3:
        list_num.remove(3)

# 循环删除后,发现有一个3依然没有删除干净.
print(list_num)  # [1, 2, 3, 2, 1]
# 为什么删不掉呢? 因为在删除的过程中元素索引值发生了改变,遍历时就会有遗漏
# 由此推论,如果在遍历时,使用insert插入数据,就有可能会重复遍历某些数据

print('----------------------------')

# 处理方案1:
list_num = [1, 2, 3, 3, 2, 1]

for i in range(list_num.count(3)):
    list_num.remove(3)

print(list_num)  # [1, 2, 2, 1]

print('----------------------------')

# 处理方案2:
list_num = [1, 2, 3, 3, 2, 1]

for i in list_num[:]:
    if i == 3:
        list_num.remove(3)

print(list_num)
